function deepclone(target = {}, map = new Map()) {

    if (typeof target != 'object') {
        return target
    }
    if (map.get(target)) { //返回与 key 关联的值，若不存在关联的值，则返回 undefined。
        return map.get(target) // 防止循环引用 无限递归
    }
    let result = {};

    if (  // 判断是对象还是数组
        target instanceof Array ||
        // 加 || 的原因是为了防止 Array 的 prototype 被重写，Array.isArray 也是如此
        Object.prototype.toString(target) === "[object Array]"
    ) {
        result = [];
    }

    map.set(target, result);
    for (const key in target) {
        // 保证 key 不是原型属性
        if (target.hasOwnProperty(key)) { //递归自己属性
            // 递归调用
            result[key] = deepclone(target[key], map);
        }
    }

    return result;

}

let objs = {
    mother: {
        val: 50,
        father: {
            val: 90
        },
    },
    father: {
        val: 90
    }
}


let res = deepclone(objs);
console.log(res);